// 微信分享工具函数
const showToast = (title, icon = 'none') => {
  // uni.showToast({ title, icon })
}

// 全局微信SDK实例
let wxSDK = null

// 加载微信JS-SDK（增强版，解决第一次加载失败问题）
export const loadWeChatSDK = async (retryCount = 0) => {
  try {
    console.log(`开始加载微信JS-SDK${retryCount > 0 ? ` (第${retryCount + 1}次重试)` : ''}...`)
    
    // 检查是否已加载
    if (window.jWeixin) {
      console.log('微信JS-SDK已存在')
      wxSDK = window.jWeixin
      return true
    }
    
    // 检查是否在微信环境
    if (!navigator.userAgent.toLowerCase().includes('micromessenger')) {
      console.log('非微信环境')
      return false
    }
    
    return new Promise((resolve, reject) => {
      const script = document.createElement('script')
      script.src = 'https://res.wx.qq.com/open/js/jweixin-1.6.0.js'
      
      // 添加随机参数避免缓存问题
      script.src += '?v=' + Date.now()
      
      let loaded = false
      
      script.onload = () => {
        if (loaded) return
        loaded = true
        console.log('微信JS-SDK加载成功')
        
        // 添加延迟确保SDK完全初始化
        setTimeout(() => {
          if (window.jWeixin) {
            wxSDK = window.jWeixin
            resolve(true)
          } else {
            reject(new Error('微信JS-SDK加载异常'))
          }
        }, 100)
      }
      
      script.onerror = (error) => {
        if (loaded) return
        loaded = true
        console.error('微信JS-SDK加载失败:', error)
        
        // 自动重试机制
        if (retryCount < 2) {
          setTimeout(() => {
            loadWeChatSDK(retryCount + 1)
              .then(resolve)
              .catch(reject)
          }, 1000)
        } else {
          reject(new Error('微信JS-SDK加载失败'))
        }
      }
      
      // 添加到head而不是body，避免重复加载问题
      document.head.appendChild(script)
      
      // 设置超时（手机端延长超时时间）
      setTimeout(() => {
        if (!loaded) {
          loaded = true
          console.error('微信JS-SDK加载超时')
          
          // 移除script避免内存泄漏
          if (script.parentNode) {
            script.parentNode.removeChild(script)
          }
          
          // 自动重试
          if (retryCount < 2) {
            setTimeout(() => {
              loadWeChatSDK(retryCount + 1)
                .then(resolve)
                .catch(reject)
            }, 1000)
          } else {
            reject(new Error('微信JS-SDK加载超时'))
          }
        }
      }, 15000) // 手机端延长到15秒
    })
  } catch (error) {
    console.error('加载微信JS-SDK时出错:', error)
    
    // 自动重试
    if (retryCount < 2) {
      await new Promise(resolve => setTimeout(resolve, 1000))
      return loadWeChatSDK(retryCount + 1)
    }
    
    return false
  }
}

// 获取微信签名配置
export const getWxSignature = async (url) => {
  try {
    console.log('开始获取微信签名，原始URL:', url)
    
    // 关键修复：微信官方要求使用原始URL（不编码）
    // 后端应该直接使用原始URL进行签名，前端发送原始URL
    console.log('使用原始URL（微信官方要求）:', url)
    
    const res = await uni.request({
      url: 'https://min.erkantv.cn:8083/api/wechat/signature',
      method: 'GET',
      data: { url: url },  // 关键：发送原始URL，不要编码
      timeout: 15000
    })
    
    console.log('签名接口响应状态:', res.statusCode)
    
    // 检查响应结构 - 适配不同的后端返回格式
    let signatureData = null
    
    if (res.data && res.data.success && res.data.data) {
      // 格式1: { success: true, data: { ... } }
      signatureData = res.data.data
    } else if (res.data && res.data.appId) {
      // 格式2: 直接返回签名数据 { appId, timestamp, nonceStr, signature }
      signatureData = res.data
    } else if (res.data) {
      // 格式3: 其他可能的格式
      signatureData = res.data
    } else {
      console.error('签名接口返回格式异常:', res.data)
      throw new Error('签名接口返回格式异常')
    }
    
    // 手机端验证签名参数完整性
    const requiredFields = ['appId', 'timestamp', 'nonceStr', 'signature']
    const missingFields = requiredFields.filter(field => !signatureData[field])
    
    if (missingFields.length > 0) {
      console.error('签名参数缺失:', missingFields)
      throw new Error('签名参数不完整')
    }
    
    console.log('获取签名成功 - AppId:', signatureData.appId)
    return signatureData
  } catch (error) {
    console.error('获取签名失败:', error.message)
    throw error
  }
}

// 初始化微信JS-SDK
export const initWxSdk = async (config) => {
  try {
    console.log('开始初始化微信SDK，配置:', config)
    
    if (!wxSDK) {
      throw new Error('微信环境异常')
    }
    
    if (!config || !config.appId || !config.timestamp || !config.nonceStr || !config.signature) {
      throw new Error('签名配置异常')
    }
    
    const configData = {
      debug: false, // 手机端关闭调试模式，避免权限验证错误
      appId: config.appId,
      timestamp: String(config.timestamp),
      nonceStr: config.nonceStr,
      signature: config.signature,
      jsApiList: [
        'updateAppMessageShareData', 
        'updateTimelineShareData',
        'onMenuShareAppMessage',
        'onMenuShareTimeline',
        'showMenuItems',
        'hideMenuItems',
        'chooseImage',
        'previewImage',
        'uploadImage',
        'downloadImage'
      ]
    }
    
    console.log('SDK配置 - AppId:', configData.appId)
    console.log('SDK配置 - 时间戳:', configData.timestamp)
    console.log('SDK配置 - 随机串:', configData.nonceStr)
    console.log('SDK配置 - 签名:', configData.signature)
    console.log('SDK配置 - API列表:', configData.jsApiList)
    
    console.log('配置参数:', configData)
    
    if (typeof wxSDK.config !== 'function') {
      throw new Error('SDK方法异常')
    }
    
    return new Promise((resolve, reject) => {
      wxSDK.config(configData)
      
      wxSDK.ready(() => {
        console.log('微信SDK初始化成功')
        resolve(true)
      })
      
      wxSDK.error((err) => {
        console.error('微信SDK配置失败:', err)
        reject(new Error('SDK配置失败: ' + JSON.stringify(err)))
      })
    })
  } catch (error) {
    console.error('初始化微信SDK时出错:', error)
    throw error
  }
}

// 图片预加载（确保分享图片可访问）
const preloadImage = (url) => {
  return new Promise((resolve, reject) => {
    const img = new Image()
    img.onload = resolve
    img.onerror = reject
    img.src = url
  })
}

// 配置分享API（分离出来的函数）
const configureShareApis = (options) => {
  try {
    // 新版API - 分享给朋友（添加函数存在性检查）
    if (typeof wxSDK.updateAppMessageShareData === 'function') {
      wxSDK.updateAppMessageShareData({
        title: options.title,
        desc: options.desc,
        link: options.link,
        imgUrl: options.imgUrl,
        success: () => {
          console.log('✅ 分享给朋友配置成功')
          console.log('分享标题:', options.title)
          console.log('分享描述:', options.desc)
        },
        fail: (err) => {
          console.error('❌ 分享给朋友配置失败', err)
        }
      })
    }

    // 新版API - 分享到朋友圈（添加函数存在性检查）
    if (typeof wxSDK.updateTimelineShareData === 'function') {
      wxSDK.updateTimelineShareData({
        title: options.title,
        link: options.link,
        imgUrl: options.imgUrl,
        success: () => {
          console.log('✅ 分享到朋友圈配置成功')
          console.log('朋友圈分享标题:', options.title)
        },
        fail: (err) => {
          console.error('❌ 分享到朋友圈配置失败', err)
        }
      })
    }

    // 旧版API兼容（必须配置：真机环境需要旧版API才能正常显示自定义标题）
    if (typeof wxSDK.onMenuShareAppMessage === 'function') {
      console.log('配置旧版分享API（真机必需）')
      wxSDK.onMenuShareAppMessage({
        title: options.title,
        desc: options.desc,
        link: options.link,
        imgUrl: options.imgUrl,
        type: 'link',
        dataUrl: '',
        success: () => console.log('✅ 旧版分享给朋友配置成功'),
        cancel: () => console.log('用户取消分享')
      })
    }

    if (typeof wxSDK.onMenuShareTimeline === 'function') {
      console.log('配置旧版朋友圈分享API（真机必需）')
      wxSDK.onMenuShareTimeline({
        title: options.title,
        link: options.link,
        imgUrl: options.imgUrl,
        success: () => console.log('✅ 旧版朋友圈分享配置成功'),
        cancel: () => console.log('用户取消朋友圈分享')
      })
    }

    // 显示分享菜单
    wxSDK.showMenuItems({
      menuList: [
        'menuItem:share:appMessage',
        'menuItem:share:timeline', 
        'menuItem:favorite'
      ],
      success: () => console.log('✅ 分享菜单显示成功'),
      fail: (err) => console.error('❌ 分享菜单显示失败', err)
    })

  } catch (error) {
    console.error('配置分享API时出错:', error)
  }
}

// 设置分享配置
export const setupShareConfig = (shareOptions = {}) => {
  try {
    if (!wxSDK) {
      throw new Error('微信SDK未加载')
    }
    
    // 手机端特殊处理：获取完整的当前URL（去除hash部分）
    let currentUrl = window.location.href.split('#')[0]
    
    // 手机端URL处理：确保URL编码一致性（重要！）
    // 微信签名要求URL必须与后端签名时使用的URL完全一致
    const domain = new URL(currentUrl).hostname
    
    console.log('设置分享配置:')
    console.log('当前URL:', currentUrl)
    console.log('域名:', domain)
    console.log('请确保该域名已在微信公众平台JS安全域名中配置')
    
    // 手机端优化配置
    const defaultOptions = {
      title: '实用小程序推荐', // 手机端避免特殊字符
      desc: '发现好用的H5小程序，点击立即体验',
      link: currentUrl,
      imgUrl: 'https://min.erkantv.cn/static/icon/geid.png?t=' + Date.now() // 添加时间戳避免缓存
    }
    
    const options = { ...defaultOptions, ...shareOptions }
    
    // 手机端特殊处理：确保图片URL是绝对路径且可访问
    if (!options.imgUrl.startsWith('http')) {
      options.imgUrl = 'https://min.erkantv.cn' + options.imgUrl
    }
    
    // 手机端优化：检查并预加载分享图片
    preloadImage(options.imgUrl).catch(() => {
      console.log('图片预加载失败，使用默认图片')
      options.imgUrl = 'https://min.erkantv.cn/static/icon/geid.png?t=' + Date.now()
    })
    
    // 手机端特殊处理：延迟配置分享API（等待SDK完全就绪）
    setTimeout(() => {
      console.log('手机端延迟配置分享API')
      configureShareApis(options)
    }, 300)
    
    // 添加重试机制 - 手机端可能需要多次配置
    let retryCount = 0
    const maxRetries = 3 // 增加重试次数
    
    const retryFunction = () => {
      if (retryCount >= maxRetries) {
        console.log('达到最大重试次数，停止重试')
        return
      }
      
      setTimeout(() => {
        console.log(`第 ${retryCount + 1} 次重试配置分享（手机端）`)
        configureShareApis(options)
        retryCount++
        retryFunction()
      }, 1500) // 增加重试间隔
    }
    
    // 启动重试机制（针对手机端）
    retryFunction()
    
    return true
  } catch (error) {
    console.error('设置分享配置时出错:', error)
    throw error
  }
}

// 完整的微信分享初始化流程（手机端优化版）
export const initWeChatShare = async (customOptions = {}) => {
  try {
    console.log('开始微信分享初始化（手机端）')
    
    // 手机端检查：确保在微信环境中
    const isWeChat = navigator.userAgent.toLowerCase().includes('micromessenger')
    if (!isWeChat) {
      console.log('❌ 非微信环境，跳过分享初始化')
      return false
    }
    
    // 手机端检查：确保HTTPS协议
    const isHttps = window.location.protocol === 'https:'
    if (!isHttps) {
      console.log('⚠️  非HTTPS环境，分享功能可能受限')
    }
    
    // 1. 加载微信SDK（手机端增加重试）
    let sdkLoaded = false
    let retryCount = 0
    const maxRetries = 2
    
    while (!sdkLoaded && retryCount <= maxRetries) {
      try {
        sdkLoaded = await loadWeChatSDK()
        if (!sdkLoaded && retryCount < maxRetries) {
          console.log(`第${retryCount + 1}次重试加载SDK...`)
          await new Promise(resolve => setTimeout(resolve, 1000))
        }
        retryCount++
      } catch (error) {
        console.error('加载SDK失败:', error)
        if (retryCount >= maxRetries) {
          showToast('微信SDK加载失败')
          return false
        }
        retryCount++
        await new Promise(resolve => setTimeout(resolve, 1000))
      }
    }
    
    if (!sdkLoaded) {
      showToast('微信环境加载失败')
      return false
    }
    
    // 2. 获取当前URL（去除hash部分）
    const currentUrl = window.location.href.split('#')[0]
    console.log('初始化分享 - 当前URL:', currentUrl)
    
    // 3. 获取签名（手机端增加重试）
    let signatureConfig = null
    retryCount = 0
    
    while (!signatureConfig && retryCount <= maxRetries) {
      try {
        signatureConfig = await getWxSignature(currentUrl)
      } catch (error) {
        console.error(`第${retryCount + 1}次获取签名失败:`, error.message)
        if (retryCount >= maxRetries) {
          showToast('获取签名失败')
          return false
        }
        retryCount++
        await new Promise(resolve => setTimeout(resolve, 1500))
      }
    }
    
    // 4. 初始化SDK
    try {
      await initWxSdk(signatureConfig)
    } catch (error) {
      console.error('SDK初始化失败:', error)
      showToast('SDK配置失败')
      return false
    }
    
    // 5. 设置分享配置（手机端延迟执行）
    setTimeout(() => {
      setupShareConfig(customOptions).catch(error => {
        console.error('分享配置失败:', error)
      })
    }, 500)
    
    console.log('✅ 微信分享功能初始化完成（手机端）')
    showToast('分享功能已就绪')
    
    return true
  } catch (error) {
    console.error('❌ 微信分享初始化失败:', error)
    showToast('分享功能初始化失败')
    return false
  }
}

// 手动触发分享
export const triggerShare = (type = 'friend', options = {}) => {
  if (!wxSDK) {
    showToast('微信SDK未加载')
    return
  }
  
  // 获取完整的当前URL（去除hash部分）
  const currentUrl = window.location.href.split('#')[0]
  const shareOptions = {
    title: options.title || '推荐实用小程序',
    desc: options.desc || '发现好用的H5小程序',
    link: currentUrl, // 使用完整的当前URL
    imgUrl: options.imgUrl || 'https://min.erkantv.cn/static/icon/geid.png'
  }
  
  if (type === 'friend') {
    wxSDK.updateAppMessageShareData(shareOptions)
  } else if (type === 'timeline') {
    wxSDK.updateTimelineShareData(shareOptions)
  }
  
  showToast('请点击右上角分享按钮')
}

// 测试分享配置
export const testShareConfig = () => {
  if (!wxSDK) {
    console.log('❌ 微信SDK未加载')
    return
  }
  
  console.log('=== 测试分享配置 ===')
  console.log('wxSDK对象:', wxSDK)
  console.log('wxSDK版本:', wxSDK.version)
  console.log('当前完整URL:', window.location.href)
  console.log('当前页面URL(去除hash):', window.location.href.split('#')[0])
  console.log('页面标题:', document.title)
  
  // 检查所有可用的方法
  const methods = [
    'config', 'ready', 'error', 
    'updateAppMessageShareData', 'updateTimelineShareData',
    'onMenuShareAppMessage', 'onMenuShareTimeline',
    'showMenuItems', 'hideMenuItems'
  ]
  
  methods.forEach(method => {
    console.log(`${method}:`, typeof wxSDK[method] === 'function' ? '✅ 可用' : '❌ 不可用')
  })
  
  // 检查当前分享配置
  console.log('=== 当前分享配置 ===')
  console.log('分享链接:', window.location.href.split('#')[0])
  console.log('分享图片:', 'https://min.erkantv.cn/static/icon/geid.png')
  
  showToast('请查看控制台测试结果')
}

export default {
  loadWeChatSDK,
  getWxSignature,
  initWxSdk,
  setupShareConfig,
  initWeChatShare,
  triggerShare,
  testShareConfig
}